library(tidyverse)
library(ggrepel)
library(fs)
library(RcppCNPy)
metadata <- read_csv("data/CCGP_squid-metadata.csv", 
                     show_col_types = FALSE) %>%
  select(PoolName, Sequencer, NMFS_DNA_ID...6, 
         GENUS, SPECIES, COLLECTION_DATE, 
         LANDFALL_PORT, CRUISE, HAUL, 
         SITE, STATE_M, LATITUDE_M, LONGITUDE_M, REGION, YEAR)
New names:
C <- as.matrix(read.table("data/all_samples/pcangsd/all-squid_ds-3_filtered.cov"))
NMFS_DNA_ID <- read_lines("data/all_samples/info/all-squid_samples.txt")
e <- eigen(C)
t <- tibble(PC1 = e$vectors[,1], 
            PC2 = e$vectors[,2], 
            PC3 = e$vectors[,3], 
            PC4 = e$vectors[,4])
temp <- add_column(t, NMFS_DNA_ID)
data <- left_join(temp, 
                  metadata, 
                  by = c("NMFS_DNA_ID" = "NMFS_DNA_ID...6"))

vars <- e$values/sum(e$values) * 100
rg_colors <- c(`Southern CA` = "#cea6ae", 
               `Central CA` = "#de6c74", 
               `Northern CA` = "#821a23", 
               `OR` = "#509ab7", 
               `AK` = "#4a3d51")
st_shapes <- c(`California` = 22, 
               `Oregon` = 23, 
               `Alaska` = 24)
yr_shapes <- c(`2014` = 25, 
               `2017` = 22, 
               `2019` = 23, 
               `2021` = 24, 
               `2022` = 21)
sq_shapes <- c(`NovaSeq6000` = 21, 
               `NovaSeqX25B` = 22)

plot <- ggplot(data = data,
               mapping = aes(x = PC1,
                             y = PC2,
                             fill = as.character(REGION), 
                             shape = as.character(YEAR))) +
  geom_point(size = 3, alpha = 0.75) + 
  geom_point(stroke = 0.05,
             alpha = 0.75,
             size = 3.5) +
  #gghighlight(Sequencer == "NovaSeqX25B") +
  scale_fill_manual(values = rg_colors) +
  # scale_fill_viridis_d() +
  scale_shape_manual(values = yr_shapes) +
  theme_bw() +
  theme(panel.grid.minor = element_blank()) +
  guides(fill = guide_legend(override.aes = list(shape = 22, 
                                                 stroke = 0.05, 
                                                 size = 3)), 
         shape = guide_legend(override.aes = list(stroke = 0.05, 
                                                  size = 3))) +
  labs(fill = "Region",
       shape = "Year",
       x = paste0("PC1 (",round(vars[1], 2),"%)"),
       y = paste0("PC2 (",round(vars[2], 2),"%)")) +
  geom_text_repel(mapping = aes(label = NMFS_DNA_ID),
                  max.overlaps = 25)
plot

C <- as.matrix(read.table("data/all_samples/pcangsd/ccgp-pools_ds-3_filtered_pcangsd_iter-1000.cov"))
NMFS_DNA_ID <- read_lines("data/all_samples/info/ccgp-pools_samples.txt")
e <- eigen(C)
t <- tibble(PC1 = e$vectors[,1], 
            PC2 = e$vectors[,2], 
            PC3 = e$vectors[,3], 
            PC4 = e$vectors[,4])
temp <- add_column(t, NMFS_DNA_ID)
ccgpfd_data <- left_join(temp, 
                         metadata, 
                         by = c("NMFS_DNA_ID" = "NMFS_DNA_ID...6"))

vars <- e$values/sum(e$values) * 100

ccgpfd_plot <- ggplot(data = ccgpfd_data,
                      mapping = aes(x = PC1,
                                    y = PC2,
                                    fill = as.character(REGION), 
                                    shape = as.character(YEAR))) +
  geom_point(size = 3, alpha = 0.75) + 
  geom_point(stroke = 0.05,
             alpha = 0.75,
             size = 3.5) +
  #gghighlight(Sequencer == "NovaSeqX25B") +
  scale_fill_manual(values = rg_colors) +
  # scale_fill_viridis_d() +
  scale_shape_manual(values = yr_shapes) +
  theme_bw() +
  theme(panel.grid.minor = element_blank()) +
  guides(fill = guide_legend(override.aes = list(shape = 22, 
                                                 stroke = 0.05, 
                                                 size = 3)), 
         shape = guide_legend(override.aes = list(stroke = 0.05, 
                                                  size = 3))) +
  labs(fill = "Region",
       shape = "Year",
       x = paste0("PC1 (",round(vars[1], 2),"%)"),
       y = paste0("PC2 (",round(vars[2], 2),"%)"), 
       title = "Filtered CCGP samples, no thinning") +
  geom_text_repel(mapping = aes(label = NMFS_DNA_ID),
                  max.overlaps = 25)
ccgpfd_plot

C <- as.matrix(read.table("data/all_samples/pcangsd/lc-pools_ds-3_filtered_pcangsd_iter-1000.cov"))
NMFS_DNA_ID <- read_lines("data/all_samples/info/lc-pools_samples.txt")
e <- eigen(C)
t <- tibble(PC1 = e$vectors[,1], 
            PC2 = e$vectors[,2], 
            PC3 = e$vectors[,3], 
            PC4 = e$vectors[,4])
temp <- add_column(t, NMFS_DNA_ID)
lcfilt_data <- left_join(temp, 
                         metadata, 
                         by = c("NMFS_DNA_ID" = "NMFS_DNA_ID...6"))

vars <- e$values/sum(e$values) * 100

lcfilt_plot <- ggplot(data = lcfilt_data,
                      mapping = aes(x = PC1,
                                    y = PC2,
                                    fill = as.character(REGION), 
                                    shape = as.character(YEAR))) +
  geom_point(size = 3, alpha = 0.75) + 
  geom_point(stroke = 0.05,
             alpha = 0.75,
             size = 3.5) +
  #gghighlight(Sequencer == "NovaSeqX25B") +
  scale_fill_manual(values = rg_colors) +
  # scale_fill_viridis_d() +
  scale_shape_manual(values = yr_shapes) +
  theme_bw() +
  theme(panel.grid.minor = element_blank()) +
  guides(fill = guide_legend(override.aes = list(shape = 22, 
                                                 stroke = 0.05, 
                                                 size = 3)), 
         shape = guide_legend(override.aes = list(stroke = 0.05, 
                                                  size = 3))) +
  labs(fill = "Region",
       shape = "Year",
       x = paste0("PC1 (",round(vars[1], 2),"%)"),
       y = paste0("PC2 (",round(vars[2], 2),"%)"), 
       title = "Filtered lc pools, no thinning") +
  geom_text_repel(mapping = aes(label = NMFS_DNA_ID),
                  max.overlaps = 25)
lcfilt_plot

NON-FILTERED DATA

C <- as.matrix(read.table("data/all_bunged/allCCGP_bunged.pcangsd.output.cov"))
NMFS_DNA_ID <- read_lines("data/all_bunged/samples.txt")
e <- eigen(C)
t <- tibble(PC1 = e$vectors[,1], 
            PC2 = e$vectors[,2], 
            PC3 = e$vectors[,3], 
            PC4 = e$vectors[,4])
temp <- add_column(t, NMFS_DNA_ID)
bunged_data <- left_join(temp, 
                         metadata, 
                         by = c("NMFS_DNA_ID" = "NMFS_DNA_ID...6"))

vars <- e$values/sum(e$values) * 100

bunged_plot <- ggplot(data = bunged_data,
                      mapping = aes(x = PC1,
                                    y = PC2,
                                    fill = as.character(REGION), 
                                    shape = as.character(Sequencer))) +
  geom_point(size = 3, alpha = 0.75) + 
  geom_point(stroke = 0.05,
             alpha = 0.75,
             size = 3.5) +
 # gghighlight(Sequencer == "NovaSeqX25B") +
  scale_fill_manual(values = rg_colors) +
  # scale_fill_viridis_d() +
  scale_shape_manual(values = sq_shapes) +
  theme_bw() +
  theme(panel.grid.minor = element_blank()) +
  guides(fill = guide_legend(override.aes = list(shape = 22, 
                                                 stroke = 0.05, 
                                                 size = 3)), 
         shape = guide_legend(override.aes = list(stroke = 0.05, 
                                                  size = 3))) +
  labs(fill = "Region",
       shape = "Sequencer",
       x = paste0("PC1 (",round(vars[1], 2),"%)"),
       y = paste0("PC2 (",round(vars[2], 2),"%)")) #+
  # geom_text_repel(mapping = aes(label = HAUL), 
  #                 max.overlaps = 25)
bunged_plot

Squid Color Palette: #310b1a, #821a23, #de6c74, #4a3d51, #91839a, #9ba2ac, #617ea6, #509ab7, #975733, #cea6ae


C <- as.matrix(read.table("data/lc_pools/bcf_pools78/thin_100_1/pcangsd/lc-pools.iter10000.pcangsd.output.cov"))
NMFS_DNA_ID <- read_lines("data/lc_pools/bcf_pools78/thin_100_1/samples.txt")
e <- eigen(C)
t <- tibble(PC1 = e$vectors[,1], 
            PC2 = e$vectors[,2], 
            PC3 = e$vectors[,3], 
            PC4 = e$vectors[,4])
temp <- add_column(t, NMFS_DNA_ID)
lc_data <- left_join(temp, 
                     metadata, 
                     by = c("NMFS_DNA_ID" = "NMFS_DNA_ID...6"))

vars <- e$values/sum(e$values) * 100

lc_plot <- ggplot(data = lc_data,
                  mapping = aes(x = PC1,
                                y = PC2,
                                fill = as.character(REGION), 
                                shape = as.character(YEAR))) +
  geom_point(size = 3, alpha = 0.75) + 
  geom_point(stroke = 0.05,
             alpha = 0.75,
             size = 3.5) +
  # gghighlight(REGION == "Northern CA") +
  scale_fill_manual(values = rg_colors) +
  # scale_fill_viridis_d() +
  scale_shape_manual(values = yr_shapes) +
  theme_bw() +
  theme(panel.grid.minor = element_blank()) +
  guides(fill = guide_legend(override.aes = list(shape = 22, 
                                                 stroke = 0.05, 
                                                 size = 3)), 
         shape = guide_legend(override.aes = list(stroke = 0.05, 
                                                  size = 3))) +
  labs(fill = "Region",
       shape = "Year",
       x = paste0("PC1 (",round(vars[1], 2),"%)"),
       y = paste0("PC2 (",round(vars[2], 2),"%)"), 
       title = "Unfiltered low cov samples, 100_1 thinning") +
  geom_text_repel(mapping = aes(label = NMFS_DNA_ID),
                  max.overlaps = 25)
lc_plot


C <- as.matrix(read.table("data/hc_pools/bcf_testy/thin_100_1/pcangsd/output.cov"))
NMFS_DNA_ID <- read_lines("data/hc_pools/bcf_testy/thin_100_1/samples.txt")
e <- eigen(C)
t <- tibble(PC1 = e$vectors[,1], 
            PC2 = e$vectors[,2], 
            PC3 = e$vectors[,3], 
            PC4 = e$vectors[,4])
temp <- add_column(t, NMFS_DNA_ID)
cc_data <- left_join(temp, 
                     metadata, 
                     by = c("NMFS_DNA_ID" = "NMFS_DNA_ID...6"))

vars <- e$values/sum(e$values) * 100

cc_plot <- ggplot(data = cc_data,
                  mapping = aes(x = PC1,
                                y = PC2,
                                fill = as.character(REGION), 
                                shape = as.character(YEAR))) +
  geom_point(size = 3, alpha = 0.75) + 
  geom_point(stroke = 0.05,
             alpha = 0.75,
             size = 3.5) +
  scale_fill_manual(values = rg_colors) +
  # scale_fill_viridis_d() +
  scale_shape_manual(values = yr_shapes) +
  theme_bw() +
  theme(panel.grid.minor = element_blank()) +
  guides(fill = guide_legend(override.aes = list(shape = 22, 
                                                 stroke = 0.05, 
                                                 size = 3)), 
         shape = guide_legend(override.aes = list(stroke = 0.05, 
                                                  size = 3))) +
  labs(fill = "Region",
       shape = "Year",
       x = paste0("PC1 (",round(vars[1], 2),"%)"),
       y = paste0("PC2 (",round(vars[2], 2),"%)"), 
       title = "Unfiltered CCGP samples, 100_1 thinned") +
  geom_text_repel(mapping = aes(label = NMFS_DNA_ID),
                  max.overlaps = 25)
cc_plot

Admixture Proportions!!!!

ngsadmix_dir <- "data/all_samples/ngsadmix/maf_0.05" # set NGSadmix outputs directory
N_K <- 10    # set number of K run
N_reps <- 10  # set number of reps run

# pull all log files
log_files <- list.files(ngsadmix_dir, pattern = ".log", full.names = T, recursive=T)

# read in all logs
all_logs <- lapply(1:length(log_files), FUN = function(i) readLines(log_files[i]))

# make list of the line that starts with "best like=" from all logs, just target 'b'
library(stringr)
bestlikes_str_list <- sapply(1:length(log_files), FUN= function(x) all_logs[[x]][which(str_sub(all_logs[[x]], 1, 1) == 'b')])

# make dataframe with 1:N_K and N_reps to add likelihood values
loglikes <- data.frame(K = rep(2:N_K, each=N_reps))

# add the log likelihood (first number in the string)
loglikes$loglike<-as.vector(as.numeric( sub("\\D*(\\d+).*", "\\1", bestlikes_str_list) ))

tapply(loglikes$loglike, loglikes$K, FUN= function(x) mean(abs(x))/sd(abs(x)))
         2          3          4          5          6          7 
  8940.081 358589.976  18733.207  14103.728  10657.093   8682.147 
         8          9         10 
  9434.179  11690.646  11723.276 
qcolors <- c(`Q1` = "#310b1a", 
            `Q2` = "#821a23", 
            `Q3` = "#de6c74", 
            `Q4` = "#4a3d51", 
            `Q5` = "#91839a", 
            `Q6` = "#9ba2ac", 
            `Q7` = "#617ea6", 
            `Q8` = "#509ab7", 
            `Q9` = "#975733", 
            `Q10` = "#cea6ae")
 
rord <- c("Southern CA", 
          "Central CA", 
          "Northern CA", 
          "OR", 
          "AK")
sord <- c("California", 
          "Oregon", 
          "Alaska")

metadata <- read_csv("data/CCGP_squid-metadata.csv") %>%
  select(PoolName, 
         NMFS_DNA_ID...6, 
         GENUS, 
         SPECIES, 
         STATE_M,
         SITE,
         LATITUDE_M, 
         LONGITUDE_M, 
         REGION) %>%
  inner_join(., 
             as.data.frame(NMFS_DNA_ID), 
             by = c("NMFS_DNA_ID...6" = "NMFS_DNA_ID")) %>%
  mutate(newname = paste0(REGION, 
                          "-", 
                          NMFS_DNA_ID)) %>%
  mutate(newname = str_replace_all(newname, 
                                   " +", 
                                   "_")) %>%
  mutate(sfact = factor(STATE_M, 
                        levels = sord), 
         rfact = factor(REGION, 
                        levels = rord)) %>%
  arrange(sfact, rfact, LATITUDE_M)
New names:Rows: 250 Columns: 42── Column specification ─────────────────────────────────────────────
Delimiter: ","
chr (24): PoolName, LibraryName, Sequencer, Sent_To, NMFS_DNA_ID....
dbl  (6): #Samples, BATCH_ID, HAUL, LATITUDE_M, LONGITUDE_M, YEAR
lgl (12): LENGTH, WEIGHT, SEX, AGE, REPORTED_LIFE_STAGE, PHENOTYP...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
nord <- unique(metadata$newname)

tmp <- metadata %>%
  mutate(xpos = 1:n())

group_pos <- tmp %>%
  group_by(STATE_M) %>%
  summarise(midx = (min(xpos) - 0.5 + max(xpos) + 0.5)/ 2, 
            linex = max(xpos) + 0.5) %>%
  mutate(midy = 1)

pop_pos <- tmp %>%
  group_by(STATE_M, REGION) %>%
  summarise(midx = (min(xpos) - 0.5 + max(xpos) + 0.5) / 2, 
            linex = max(xpos) + 0.5) %>%
  mutate(midy = 0)
`summarise()` has grouped output by 'STATE_M'. You can override using the `.groups` argument.
ngsadmix_files <- dir_ls("data/all_samples/ngsadmix", 
                         recurse = TRUE, 
                         glob = "*.qopt_with_sample_names")

ngsAdmix_tib <- lapply(ngsadmix_files, function(x) {
  read.table(x, 
             header = TRUE) %>%
    pivot_longer(cols = -sample, 
                 names_to = "Qval", 
                 values_to = "value") %>%
    mutate(path = x, 
           .before = sample)
}) %>%
  bind_rows() %>%
  filter(!is.na(value)) %>%
  mutate(Qval = str_replace(Qval, 
                            "X", 
                            "Q")) %>%
  extract(path, 
          into = c("K", 
                   "rep"), 
          regex = ".*K_([0-9]+)_rep_([0-9]+)/.*$", 
          convert = TRUE) %>%
  inner_join(., 
             metadata, 
             by = c("sample" = "NMFS_DNA_ID...6"), 
             relationship = "many-to-many") %>%
  mutate(sfact = factor(STATE_M, 
                        levels = sord), 
         rfact = factor(REGION,
                        levels = rord)) %>%
  arrange(sfact, rfact)
plot <- ggplot(filter(ngsAdmix_tib, rep == 1)) + 
  geom_col(mapping = aes(x = factor(newname, 
                                    levels = nord), 
                         y = value, 
                         fill = Qval)) +
  #scale_fill_manual(values = qcolors) + 
  theme_bw() +
  theme(axis.text.x = element_text(angle = 90, 
                                   size = 8, 
                                   vjust = 0.5)) +
  facet_grid(K ~ rep) +
  labs(x = "", 
       y = "Q value") +
  geom_vline(xintercept = pop_pos$linex, 
             linetype = 1, 
             color = "gray25") +
  geom_vline(xintercept = group_pos$linex)


plot

squid_palette <- c("#310b1a", "#821a23", "#de6c74", "#4a3d51", "#91839a", "#9ba2ac", "#617ea6", "#509ab7", "#975733", "#cea6ae")

K2 <- read.table("data/all_samples/ngsadmix/maf_0.05/K_2_rep_1/output.qopt_with_sample_names", header = TRUE) %>%
  inner_join(., 
             metadata, 
             by = c("sample" = "NMFS_DNA_ID...6"))
K2_ordered <- K2[order(K2$sfact, K2$rfact),]

tmp <- K2_ordered %>%
  mutate(xpos = 1:n())
state_pos <- tmp %>%
  group_by(STATE_M) %>%
  summarise(midx = (min(xpos) - 0.5 + max(xpos) +0.5) / 2, 
            linex = max(xpos)) %>%
  mutate(midy = 1)
reg_pos <- tmp %>%
  group_by(STATE_M, REGION) %>%
  summarise(midx = (min(xpos) - 0.5), 
            linex = max(xpos)) %>%
  mutate(midy = -1)
`summarise()` has grouped output by 'STATE_M'. You can override using the `.groups` argument.
squid_palette_2 <- c("#310b1a", 
                      "#de6c74")

barplot(t(K2_ordered[2:4]), 
         col = squid_palette_2, 
         names = K2_ordered$sample, 
         cex.names = 0.5,
         las = 2,
         space = 0, 
         border = NA, 
         cex.axis = 1, 
         cex.lab = 1.13, 
         xpd = NA, 
         ylab = paste0("Admixture Proportions (K=2)"))
Warning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercion
  abline(v = reg_pos$linex, col = "gray80", lty = 2) 
  abline(v = state_pos$linex, col = "white") 

  # text(labels = reg_pos$REGION,
  #      cex = 0.8,
  #      srt = 90,
  #      x = reg_pos$midx + 0.5,
  #      y = 1.001,
  #      adj = 0,
  #      xpd = NA)
squid_palette <- c("#310b1a", "#821a23", "#de6c74", "#4a3d51", "#91839a", "#9ba2ac", "#617ea6", "#509ab7", "#975733", "#cea6ae")

K3 <- read.table("data/all_samples/ngsadmix/maf_0.05/K_3_rep_1/output.qopt_with_sample_names", header = TRUE) %>%
  inner_join(., 
             metadata, 
             by = c("sample" = "NMFS_DNA_ID...6"))
K3_ordered <- K3[order(K3$sfact, K3$rfact),]

squid_palette_3 <- c("#de6c74",
                     "#310b1a",
                     "#4a3d51")

barplot(t(K3_ordered[2:5]), 
         col = squid_palette_3, 
         names = NULL, 
         cex.names = 0.00001,
         las = 2,
         space = 0, 
         border = NA, 
         cex.axis = 1, 
         cex.lab = 1.13, 
         xpd = NA, 
         ylab = paste0("Admixture Proportions (K=3)"))
Warning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercion
  abline(v = reg_pos$linex, col = "gray80", lty = 2) 
  abline(v = state_pos$linex, col = "white") 

  # text(labels = reg_pos$REGION,
  #      cex = 0.8,
  #      srt = 90,
  #      x = reg_pos$midx + 0.5,
  #      y = 1.001,
  #      adj = 0,
  #      xpd = NA)
squid_palette <- c("#310b1a", "#821a23", "#de6c74", "#4a3d51", "#91839a", "#9ba2ac", "#617ea6", "#509ab7", "#975733", "#cea6ae")

K4 <- read.table("data/all_samples/ngsadmix/maf_0.05/K_4_rep_1/output.qopt_with_sample_names", header = TRUE) %>%
  inner_join(., 
             metadata, 
             by = c("sample" = "NMFS_DNA_ID...6"))
K4_ordered <- K4[order(K4$sfact, K4$rfact),]

squid_palette_4 <- c("#de6c74",
                     "#310b1a",
                     "#4a3d51", 
                     "#509ab7")

barplot(t(K4_ordered[2:6]), 
         col = squid_palette_4, 
         names = NULL, 
         cex.names = 0.00001,
         las = 2,
         space = 0, 
         border = NA, 
         cex.axis = 1, 
         cex.lab = 1.13, 
         xpd = NA, 
         ylab = paste0("Admixture Proportions (K=4)"))
Warning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercionWarning: NAs introduced by coercion
  abline(v = reg_pos$linex, col = "gray80", lty = 2) 
  abline(v = state_pos$linex, col = "white") 

  # text(labels = reg_pos$REGION, 
  #      cex = 2, 
  #      srt = 90,
  #      x = reg_pos$midx + 0.5, 
  #      y = 1.001, 
  #      adj = 0, 
  #      xpd = NA)
LS0tCnRpdGxlOiAiQWxsIFNxdWlkIEV4cGxvcmF0b3J5IEFuYWx5c2lzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3IgbGlicmFyaWVzfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ3JlcGVsKQpsaWJyYXJ5KGZzKQpsaWJyYXJ5KFJjcHBDTlB5KQpgYGAKCgpgYGB7ciBkYXRhX29yZ30KbWV0YWRhdGEgPC0gcmVhZF9jc3YoImRhdGEvQ0NHUF9zcXVpZC1tZXRhZGF0YS5jc3YiLCAKICAgICAgICAgICAgICAgICAgICAgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkgJT4lCiAgc2VsZWN0KFBvb2xOYW1lLCBTZXF1ZW5jZXIsIE5NRlNfRE5BX0lELi4uNiwgCiAgICAgICAgIEdFTlVTLCBTUEVDSUVTLCBDT0xMRUNUSU9OX0RBVEUsIAogICAgICAgICBMQU5ERkFMTF9QT1JULCBDUlVJU0UsIEhBVUwsIAogICAgICAgICBTSVRFLCBTVEFURV9NLCBMQVRJVFVERV9NLCBMT05HSVRVREVfTSwgUkVHSU9OLCBZRUFSKQoKQyA8LSBhcy5tYXRyaXgocmVhZC50YWJsZSgiZGF0YS9hbGxfc2FtcGxlcy9wY2FuZ3NkL2FsbC1zcXVpZF9kcy0zX2ZpbHRlcmVkLmNvdiIpKQpOTUZTX0ROQV9JRCA8LSByZWFkX2xpbmVzKCJkYXRhL2FsbF9zYW1wbGVzL2luZm8vYWxsLXNxdWlkX3NhbXBsZXMudHh0IikKZSA8LSBlaWdlbihDKQp0IDwtIHRpYmJsZShQQzEgPSBlJHZlY3RvcnNbLDFdLCAKICAgICAgICAgICAgUEMyID0gZSR2ZWN0b3JzWywyXSwgCiAgICAgICAgICAgIFBDMyA9IGUkdmVjdG9yc1ssM10sIAogICAgICAgICAgICBQQzQgPSBlJHZlY3RvcnNbLDRdKQp0ZW1wIDwtIGFkZF9jb2x1bW4odCwgTk1GU19ETkFfSUQpCmRhdGEgPC0gbGVmdF9qb2luKHRlbXAsIAogICAgICAgICAgICAgICAgICBtZXRhZGF0YSwgCiAgICAgICAgICAgICAgICAgIGJ5ID0gYygiTk1GU19ETkFfSUQiID0gIk5NRlNfRE5BX0lELi4uNiIpKQoKdmFycyA8LSBlJHZhbHVlcy9zdW0oZSR2YWx1ZXMpICogMTAwCgpgYGAKCmBgYHtyIFBDQV9wbG90fQpyZ19jb2xvcnMgPC0gYyhgU291dGhlcm4gQ0FgID0gIiNjZWE2YWUiLCAKICAgICAgICAgICAgICAgYENlbnRyYWwgQ0FgID0gIiNkZTZjNzQiLCAKICAgICAgICAgICAgICAgYE5vcnRoZXJuIENBYCA9ICIjODIxYTIzIiwgCiAgICAgICAgICAgICAgIGBPUmAgPSAiIzUwOWFiNyIsIAogICAgICAgICAgICAgICBgQUtgID0gIiM0YTNkNTEiKQpzdF9zaGFwZXMgPC0gYyhgQ2FsaWZvcm5pYWAgPSAyMiwgCiAgICAgICAgICAgICAgIGBPcmVnb25gID0gMjMsIAogICAgICAgICAgICAgICBgQWxhc2thYCA9IDI0KQp5cl9zaGFwZXMgPC0gYyhgMjAxNGAgPSAyNSwgCiAgICAgICAgICAgICAgIGAyMDE3YCA9IDIyLCAKICAgICAgICAgICAgICAgYDIwMTlgID0gMjMsIAogICAgICAgICAgICAgICBgMjAyMWAgPSAyNCwgCiAgICAgICAgICAgICAgIGAyMDIyYCA9IDIxKQpzcV9zaGFwZXMgPC0gYyhgTm92YVNlcTYwMDBgID0gMjEsIAogICAgICAgICAgICAgICBgTm92YVNlcVgyNUJgID0gMjIpCgpwbG90IDwtIGdncGxvdChkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gUEMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBQQzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGFzLmNoYXJhY3RlcihSRUdJT04pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmNoYXJhY3RlcihZRUFSKSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLCBhbHBoYSA9IDAuNzUpICsgCiAgZ2VvbV9wb2ludChzdHJva2UgPSAwLjA1LAogICAgICAgICAgICAgYWxwaGEgPSAwLjc1LAogICAgICAgICAgICAgc2l6ZSA9IDMuNSkgKwogICNnZ2hpZ2hsaWdodChTZXF1ZW5jZXIgPT0gIk5vdmFTZXFYMjVCIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHJnX2NvbG9ycykgKwogICMgc2NhbGVfZmlsbF92aXJpZGlzX2QoKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHlyX3NoYXBlcykgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpICsKICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNoYXBlID0gMjIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlID0gMC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMykpLCAKICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzdHJva2UgPSAwLjA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMykpKSArCiAgbGFicyhmaWxsID0gIlJlZ2lvbiIsCiAgICAgICBzaGFwZSA9ICJZZWFyIiwKICAgICAgIHggPSBwYXN0ZTAoIlBDMSAoIixyb3VuZCh2YXJzWzFdLCAyKSwiJSkiKSwKICAgICAgIHkgPSBwYXN0ZTAoIlBDMiAoIixyb3VuZCh2YXJzWzJdLCAyKSwiJSkiKSkgKwogIGdlb21fdGV4dF9yZXBlbChtYXBwaW5nID0gYWVzKGxhYmVsID0gTk1GU19ETkFfSUQpLAogICAgICAgICAgICAgICAgICBtYXgub3ZlcmxhcHMgPSAyNSkKcGxvdApgYGAKCmBgYHtyfQpDIDwtIGFzLm1hdHJpeChyZWFkLnRhYmxlKCJkYXRhL2FsbF9zYW1wbGVzL3BjYW5nc2QvY2NncC1wb29sc19kcy0zX2ZpbHRlcmVkX3BjYW5nc2RfaXRlci0xMDAwLmNvdiIpKQpOTUZTX0ROQV9JRCA8LSByZWFkX2xpbmVzKCJkYXRhL2FsbF9zYW1wbGVzL2luZm8vY2NncC1wb29sc19zYW1wbGVzLnR4dCIpCmUgPC0gZWlnZW4oQykKdCA8LSB0aWJibGUoUEMxID0gZSR2ZWN0b3JzWywxXSwgCiAgICAgICAgICAgIFBDMiA9IGUkdmVjdG9yc1ssMl0sIAogICAgICAgICAgICBQQzMgPSBlJHZlY3RvcnNbLDNdLCAKICAgICAgICAgICAgUEM0ID0gZSR2ZWN0b3JzWyw0XSkKdGVtcCA8LSBhZGRfY29sdW1uKHQsIE5NRlNfRE5BX0lEKQpjY2dwZmRfZGF0YSA8LSBsZWZ0X2pvaW4odGVtcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoIk5NRlNfRE5BX0lEIiA9ICJOTUZTX0ROQV9JRC4uLjYiKSkKCnZhcnMgPC0gZSR2YWx1ZXMvc3VtKGUkdmFsdWVzKSAqIDEwMAoKY2NncGZkX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBjY2dwZmRfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IFBDMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IFBDMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGFzLmNoYXJhY3RlcihSRUdJT04pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBhcy5jaGFyYWN0ZXIoWUVBUikpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywgYWxwaGEgPSAwLjc1KSArIAogIGdlb21fcG9pbnQoc3Ryb2tlID0gMC4wNSwKICAgICAgICAgICAgIGFscGhhID0gMC43NSwKICAgICAgICAgICAgIHNpemUgPSAzLjUpICsKICAjZ2doaWdobGlnaHQoU2VxdWVuY2VyID09ICJOb3ZhU2VxWDI1QiIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSByZ19jb2xvcnMpICsKICAjIHNjYWxlX2ZpbGxfdmlyaWRpc19kKCkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSB5cl9zaGFwZXMpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaGFwZSA9IDIyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZSA9IDAuMDUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMpKSwgCiAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc3Ryb2tlID0gMC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMpKSkgKwogIGxhYnMoZmlsbCA9ICJSZWdpb24iLAogICAgICAgc2hhcGUgPSAiWWVhciIsCiAgICAgICB4ID0gcGFzdGUwKCJQQzEgKCIscm91bmQodmFyc1sxXSwgMiksIiUpIiksCiAgICAgICB5ID0gcGFzdGUwKCJQQzIgKCIscm91bmQodmFyc1syXSwgMiksIiUpIiksIAogICAgICAgdGl0bGUgPSAiRmlsdGVyZWQgQ0NHUCBzYW1wbGVzLCBubyB0aGlubmluZyIpICsKICBnZW9tX3RleHRfcmVwZWwobWFwcGluZyA9IGFlcyhsYWJlbCA9IE5NRlNfRE5BX0lEKSwKICAgICAgICAgICAgICAgICAgbWF4Lm92ZXJsYXBzID0gMjUpCmNjZ3BmZF9wbG90CmBgYAoKYGBge3J9CkMgPC0gYXMubWF0cml4KHJlYWQudGFibGUoImRhdGEvYWxsX3NhbXBsZXMvcGNhbmdzZC9sYy1wb29sc19kcy0zX2ZpbHRlcmVkX3BjYW5nc2RfaXRlci0xMDAwLmNvdiIpKQpOTUZTX0ROQV9JRCA8LSByZWFkX2xpbmVzKCJkYXRhL2FsbF9zYW1wbGVzL2luZm8vbGMtcG9vbHNfc2FtcGxlcy50eHQiKQplIDwtIGVpZ2VuKEMpCnQgPC0gdGliYmxlKFBDMSA9IGUkdmVjdG9yc1ssMV0sIAogICAgICAgICAgICBQQzIgPSBlJHZlY3RvcnNbLDJdLCAKICAgICAgICAgICAgUEMzID0gZSR2ZWN0b3JzWywzXSwgCiAgICAgICAgICAgIFBDNCA9IGUkdmVjdG9yc1ssNF0pCnRlbXAgPC0gYWRkX2NvbHVtbih0LCBOTUZTX0ROQV9JRCkKbGNmaWx0X2RhdGEgPC0gbGVmdF9qb2luKHRlbXAsIAogICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJOTUZTX0ROQV9JRCIgPSAiTk1GU19ETkFfSUQuLi42IikpCgp2YXJzIDwtIGUkdmFsdWVzL3N1bShlJHZhbHVlcykgKiAxMDAKCmxjZmlsdF9wbG90IDwtIGdncGxvdChkYXRhID0gbGNmaWx0X2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBQQzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBQQzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBhcy5jaGFyYWN0ZXIoUkVHSU9OKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuY2hhcmFjdGVyKFlFQVIpKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC43NSkgKyAKICBnZW9tX3BvaW50KHN0cm9rZSA9IDAuMDUsCiAgICAgICAgICAgICBhbHBoYSA9IDAuNzUsCiAgICAgICAgICAgICBzaXplID0gMy41KSArCiAgI2dnaGlnaGxpZ2h0KFNlcXVlbmNlciA9PSAiTm92YVNlcVgyNUIiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcmdfY29sb3JzKSArCiAgIyBzY2FsZV9maWxsX3ZpcmlkaXNfZCgpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0geXJfc2hhcGVzKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2hhcGUgPSAyMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UgPSAwLjA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzKSksIAogICAgICAgICBzaGFwZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHN0cm9rZSA9IDAuMDUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzKSkpICsKICBsYWJzKGZpbGwgPSAiUmVnaW9uIiwKICAgICAgIHNoYXBlID0gIlllYXIiLAogICAgICAgeCA9IHBhc3RlMCgiUEMxICgiLHJvdW5kKHZhcnNbMV0sIDIpLCIlKSIpLAogICAgICAgeSA9IHBhc3RlMCgiUEMyICgiLHJvdW5kKHZhcnNbMl0sIDIpLCIlKSIpLCAKICAgICAgIHRpdGxlID0gIkZpbHRlcmVkIGxjIHBvb2xzLCBubyB0aGlubmluZyIpICsKICBnZW9tX3RleHRfcmVwZWwobWFwcGluZyA9IGFlcyhsYWJlbCA9IE5NRlNfRE5BX0lEKSwKICAgICAgICAgICAgICAgICAgbWF4Lm92ZXJsYXBzID0gMjUpCmxjZmlsdF9wbG90CmBgYAoKTk9OLUZJTFRFUkVEIERBVEEKYGBge3J9CkMgPC0gYXMubWF0cml4KHJlYWQudGFibGUoImRhdGEvYWxsX2J1bmdlZC9hbGxDQ0dQX2J1bmdlZC5wY2FuZ3NkLm91dHB1dC5jb3YiKSkKTk1GU19ETkFfSUQgPC0gcmVhZF9saW5lcygiZGF0YS9hbGxfYnVuZ2VkL3NhbXBsZXMudHh0IikKZSA8LSBlaWdlbihDKQp0IDwtIHRpYmJsZShQQzEgPSBlJHZlY3RvcnNbLDFdLCAKICAgICAgICAgICAgUEMyID0gZSR2ZWN0b3JzWywyXSwgCiAgICAgICAgICAgIFBDMyA9IGUkdmVjdG9yc1ssM10sIAogICAgICAgICAgICBQQzQgPSBlJHZlY3RvcnNbLDRdKQp0ZW1wIDwtIGFkZF9jb2x1bW4odCwgTk1GU19ETkFfSUQpCmJ1bmdlZF9kYXRhIDwtIGxlZnRfam9pbih0ZW1wLCAKICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiTk1GU19ETkFfSUQiID0gIk5NRlNfRE5BX0lELi4uNiIpKQoKdmFycyA8LSBlJHZhbHVlcy9zdW0oZSR2YWx1ZXMpICogMTAwCgpidW5nZWRfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGJ1bmdlZF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gUEMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gUEMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gYXMuY2hhcmFjdGVyKFJFR0lPTiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGFzLmNoYXJhY3RlcihTZXF1ZW5jZXIpKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC43NSkgKyAKICBnZW9tX3BvaW50KHN0cm9rZSA9IDAuMDUsCiAgICAgICAgICAgICBhbHBoYSA9IDAuNzUsCiAgICAgICAgICAgICBzaXplID0gMy41KSArCiAjIGdnaGlnaGxpZ2h0KFNlcXVlbmNlciA9PSAiTm92YVNlcVgyNUIiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcmdfY29sb3JzKSArCiAgIyBzY2FsZV9maWxsX3ZpcmlkaXNfZCgpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gc3Ffc2hhcGVzKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2hhcGUgPSAyMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UgPSAwLjA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzKSksIAogICAgICAgICBzaGFwZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHN0cm9rZSA9IDAuMDUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzKSkpICsKICBsYWJzKGZpbGwgPSAiUmVnaW9uIiwKICAgICAgIHNoYXBlID0gIlNlcXVlbmNlciIsCiAgICAgICB4ID0gcGFzdGUwKCJQQzEgKCIscm91bmQodmFyc1sxXSwgMiksIiUpIiksCiAgICAgICB5ID0gcGFzdGUwKCJQQzIgKCIscm91bmQodmFyc1syXSwgMiksIiUpIikpICMrCiAgIyBnZW9tX3RleHRfcmVwZWwobWFwcGluZyA9IGFlcyhsYWJlbCA9IEhBVUwpLCAKICAjICAgICAgICAgICAgICAgICBtYXgub3ZlcmxhcHMgPSAyNSkKYnVuZ2VkX3Bsb3QKYGBgCgoKU3F1aWQgQ29sb3IgUGFsZXR0ZTogIzMxMGIxYSwgIzgyMWEyMywgI2RlNmM3NCwgIzRhM2Q1MSwgIzkxODM5YSwgIzliYTJhYywgIzYxN2VhNiwgIzUwOWFiNywgIzk3NTczMywgI2NlYTZhZQoKYGBge3IgZGF0YV9vcmdfbGN9CgpDIDwtIGFzLm1hdHJpeChyZWFkLnRhYmxlKCJkYXRhL2xjX3Bvb2xzL2JjZl9wb29sczc4L3RoaW5fMTAwXzEvcGNhbmdzZC9sYy1wb29scy5pdGVyMTAwMDAucGNhbmdzZC5vdXRwdXQuY292IikpCk5NRlNfRE5BX0lEIDwtIHJlYWRfbGluZXMoImRhdGEvbGNfcG9vbHMvYmNmX3Bvb2xzNzgvdGhpbl8xMDBfMS9zYW1wbGVzLnR4dCIpCmUgPC0gZWlnZW4oQykKdCA8LSB0aWJibGUoUEMxID0gZSR2ZWN0b3JzWywxXSwgCiAgICAgICAgICAgIFBDMiA9IGUkdmVjdG9yc1ssMl0sIAogICAgICAgICAgICBQQzMgPSBlJHZlY3RvcnNbLDNdLCAKICAgICAgICAgICAgUEM0ID0gZSR2ZWN0b3JzWyw0XSkKdGVtcCA8LSBhZGRfY29sdW1uKHQsIE5NRlNfRE5BX0lEKQpsY19kYXRhIDwtIGxlZnRfam9pbih0ZW1wLCAKICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsIAogICAgICAgICAgICAgICAgICAgICBieSA9IGMoIk5NRlNfRE5BX0lEIiA9ICJOTUZTX0ROQV9JRC4uLjYiKSkKCnZhcnMgPC0gZSR2YWx1ZXMvc3VtKGUkdmFsdWVzKSAqIDEwMAoKYGBgCgpgYGB7ciBQQ0FfcGxvdF9sY30KCmxjX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBsY19kYXRhLAogICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBQQzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IFBDMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gYXMuY2hhcmFjdGVyKFJFR0lPTiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuY2hhcmFjdGVyKFlFQVIpKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC43NSkgKyAKICBnZW9tX3BvaW50KHN0cm9rZSA9IDAuMDUsCiAgICAgICAgICAgICBhbHBoYSA9IDAuNzUsCiAgICAgICAgICAgICBzaXplID0gMy41KSArCiAgIyBnZ2hpZ2hsaWdodChSRUdJT04gPT0gIk5vcnRoZXJuIENBIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHJnX2NvbG9ycykgKwogICMgc2NhbGVfZmlsbF92aXJpZGlzX2QoKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHlyX3NoYXBlcykgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpICsKICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNoYXBlID0gMjIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlID0gMC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMykpLCAKICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzdHJva2UgPSAwLjA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMykpKSArCiAgbGFicyhmaWxsID0gIlJlZ2lvbiIsCiAgICAgICBzaGFwZSA9ICJZZWFyIiwKICAgICAgIHggPSBwYXN0ZTAoIlBDMSAoIixyb3VuZCh2YXJzWzFdLCAyKSwiJSkiKSwKICAgICAgIHkgPSBwYXN0ZTAoIlBDMiAoIixyb3VuZCh2YXJzWzJdLCAyKSwiJSkiKSwgCiAgICAgICB0aXRsZSA9ICJVbmZpbHRlcmVkIGxvdyBjb3Ygc2FtcGxlcywgMTAwXzEgdGhpbm5pbmciKSArCiAgZ2VvbV90ZXh0X3JlcGVsKG1hcHBpbmcgPSBhZXMobGFiZWwgPSBOTUZTX0ROQV9JRCksCiAgICAgICAgICAgICAgICAgIG1heC5vdmVybGFwcyA9IDI1KQpsY19wbG90CmBgYAoKCmBgYHtyIGRhdGFfb3JnX2NjfQoKQyA8LSBhcy5tYXRyaXgocmVhZC50YWJsZSgiZGF0YS9oY19wb29scy9iY2ZfdGVzdHkvdGhpbl8xMDBfMS9wY2FuZ3NkL291dHB1dC5jb3YiKSkKTk1GU19ETkFfSUQgPC0gcmVhZF9saW5lcygiZGF0YS9oY19wb29scy9iY2ZfdGVzdHkvdGhpbl8xMDBfMS9zYW1wbGVzLnR4dCIpCmUgPC0gZWlnZW4oQykKdCA8LSB0aWJibGUoUEMxID0gZSR2ZWN0b3JzWywxXSwgCiAgICAgICAgICAgIFBDMiA9IGUkdmVjdG9yc1ssMl0sIAogICAgICAgICAgICBQQzMgPSBlJHZlY3RvcnNbLDNdLCAKICAgICAgICAgICAgUEM0ID0gZSR2ZWN0b3JzWyw0XSkKdGVtcCA8LSBhZGRfY29sdW1uKHQsIE5NRlNfRE5BX0lEKQpjY19kYXRhIDwtIGxlZnRfam9pbih0ZW1wLCAKICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsIAogICAgICAgICAgICAgICAgICAgICBieSA9IGMoIk5NRlNfRE5BX0lEIiA9ICJOTUZTX0ROQV9JRC4uLjYiKSkKCnZhcnMgPC0gZSR2YWx1ZXMvc3VtKGUkdmFsdWVzKSAqIDEwMAoKYGBgCgpgYGB7ciBQQ0FfcGxvdF9jY30KCmNjX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBjY19kYXRhLAogICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBQQzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IFBDMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gYXMuY2hhcmFjdGVyKFJFR0lPTiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gYXMuY2hhcmFjdGVyKFlFQVIpKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC43NSkgKyAKICBnZW9tX3BvaW50KHN0cm9rZSA9IDAuMDUsCiAgICAgICAgICAgICBhbHBoYSA9IDAuNzUsCiAgICAgICAgICAgICBzaXplID0gMy41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcmdfY29sb3JzKSArCiAgIyBzY2FsZV9maWxsX3ZpcmlkaXNfZCgpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0geXJfc2hhcGVzKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2hhcGUgPSAyMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UgPSAwLjA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzKSksIAogICAgICAgICBzaGFwZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHN0cm9rZSA9IDAuMDUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzKSkpICsKICBsYWJzKGZpbGwgPSAiUmVnaW9uIiwKICAgICAgIHNoYXBlID0gIlllYXIiLAogICAgICAgeCA9IHBhc3RlMCgiUEMxICgiLHJvdW5kKHZhcnNbMV0sIDIpLCIlKSIpLAogICAgICAgeSA9IHBhc3RlMCgiUEMyICgiLHJvdW5kKHZhcnNbMl0sIDIpLCIlKSIpLCAKICAgICAgIHRpdGxlID0gIlVuZmlsdGVyZWQgQ0NHUCBzYW1wbGVzLCAxMDBfMSB0aGlubmVkIikgKwogIGdlb21fdGV4dF9yZXBlbChtYXBwaW5nID0gYWVzKGxhYmVsID0gTk1GU19ETkFfSUQpLAogICAgICAgICAgICAgICAgICBtYXgub3ZlcmxhcHMgPSAyNSkKY2NfcGxvdApgYGAKCkFkbWl4dHVyZSBQcm9wb3J0aW9ucyEhISEKYGBge3J9Cm5nc2FkbWl4X2RpciA8LSAiZGF0YS9hbGxfc2FtcGxlcy9uZ3NhZG1peC9tYWZfMC4wNSIgIyBzZXQgTkdTYWRtaXggb3V0cHV0cyBkaXJlY3RvcnkKTl9LIDwtIDEwICAgICMgc2V0IG51bWJlciBvZiBLIHJ1bgpOX3JlcHMgPC0gMTAgICMgc2V0IG51bWJlciBvZiByZXBzIHJ1bgoKIyBwdWxsIGFsbCBsb2cgZmlsZXMKbG9nX2ZpbGVzIDwtIGxpc3QuZmlsZXMobmdzYWRtaXhfZGlyLCBwYXR0ZXJuID0gIi5sb2ciLCBmdWxsLm5hbWVzID0gVCwgcmVjdXJzaXZlPVQpCgojIHJlYWQgaW4gYWxsIGxvZ3MKYWxsX2xvZ3MgPC0gbGFwcGx5KDE6bGVuZ3RoKGxvZ19maWxlcyksIEZVTiA9IGZ1bmN0aW9uKGkpIHJlYWRMaW5lcyhsb2dfZmlsZXNbaV0pKQoKIyBtYWtlIGxpc3Qgb2YgdGhlIGxpbmUgdGhhdCBzdGFydHMgd2l0aCAiYmVzdCBsaWtlPSIgZnJvbSBhbGwgbG9ncywganVzdCB0YXJnZXQgJ2InCmxpYnJhcnkoc3RyaW5ncikKYmVzdGxpa2VzX3N0cl9saXN0IDwtIHNhcHBseSgxOmxlbmd0aChsb2dfZmlsZXMpLCBGVU49IGZ1bmN0aW9uKHgpIGFsbF9sb2dzW1t4XV1bd2hpY2goc3RyX3N1YihhbGxfbG9nc1tbeF1dLCAxLCAxKSA9PSAnYicpXSkKCiMgbWFrZSBkYXRhZnJhbWUgd2l0aCAxOk5fSyBhbmQgTl9yZXBzIHRvIGFkZCBsaWtlbGlob29kIHZhbHVlcwpsb2dsaWtlcyA8LSBkYXRhLmZyYW1lKEsgPSByZXAoMjpOX0ssIGVhY2g9Tl9yZXBzKSkKCiMgYWRkIHRoZSBsb2cgbGlrZWxpaG9vZCAoZmlyc3QgbnVtYmVyIGluIHRoZSBzdHJpbmcpCmxvZ2xpa2VzJGxvZ2xpa2U8LWFzLnZlY3Rvcihhcy5udW1lcmljKCBzdWIoIlxcRCooXFxkKykuKiIsICJcXDEiLCBiZXN0bGlrZXNfc3RyX2xpc3QpICkpCgp0YXBwbHkobG9nbGlrZXMkbG9nbGlrZSwgbG9nbGlrZXMkSywgRlVOPSBmdW5jdGlvbih4KSBtZWFuKGFicyh4KSkvc2QoYWJzKHgpKSkKYGBgCgpgYGB7cn0KcWNvbG9ycyA8LSBjKGBRMWAgPSAiIzMxMGIxYSIsIAogICAgICAgICAgICBgUTJgID0gIiM4MjFhMjMiLCAKICAgICAgICAgICAgYFEzYCA9ICIjZGU2Yzc0IiwgCiAgICAgICAgICAgIGBRNGAgPSAiIzRhM2Q1MSIsIAogICAgICAgICAgICBgUTVgID0gIiM5MTgzOWEiLCAKICAgICAgICAgICAgYFE2YCA9ICIjOWJhMmFjIiwgCiAgICAgICAgICAgIGBRN2AgPSAiIzYxN2VhNiIsIAogICAgICAgICAgICBgUThgID0gIiM1MDlhYjciLCAKICAgICAgICAgICAgYFE5YCA9ICIjOTc1NzMzIiwgCiAgICAgICAgICAgIGBRMTBgID0gIiNjZWE2YWUiKQogCnJvcmQgPC0gYygiU291dGhlcm4gQ0EiLCAKICAgICAgICAgICJDZW50cmFsIENBIiwgCiAgICAgICAgICAiTm9ydGhlcm4gQ0EiLCAKICAgICAgICAgICJPUiIsIAogICAgICAgICAgIkFLIikKc29yZCA8LSBjKCJDYWxpZm9ybmlhIiwgCiAgICAgICAgICAiT3JlZ29uIiwgCiAgICAgICAgICAiQWxhc2thIikKCm1ldGFkYXRhIDwtIHJlYWRfY3N2KCJkYXRhL0NDR1Bfc3F1aWQtbWV0YWRhdGEuY3N2IikgJT4lCiAgc2VsZWN0KFBvb2xOYW1lLCAKICAgICAgICAgTk1GU19ETkFfSUQuLi42LCAKICAgICAgICAgR0VOVVMsIAogICAgICAgICBTUEVDSUVTLCAKICAgICAgICAgU1RBVEVfTSwKICAgICAgICAgU0lURSwKICAgICAgICAgTEFUSVRVREVfTSwgCiAgICAgICAgIExPTkdJVFVERV9NLCAKICAgICAgICAgUkVHSU9OKSAlPiUKICBpbm5lcl9qb2luKC4sIAogICAgICAgICAgICAgYXMuZGF0YS5mcmFtZShOTUZTX0ROQV9JRCksIAogICAgICAgICAgICAgYnkgPSBjKCJOTUZTX0ROQV9JRC4uLjYiID0gIk5NRlNfRE5BX0lEIikpICU+JQogIG11dGF0ZShuZXduYW1lID0gcGFzdGUwKFJFR0lPTiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIi0iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBOTUZTX0ROQV9JRCkpICU+JQogIG11dGF0ZShuZXduYW1lID0gc3RyX3JlcGxhY2VfYWxsKG5ld25hbWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfIikpICU+JQogIG11dGF0ZShzZmFjdCA9IGZhY3RvcihTVEFURV9NLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gc29yZCksIAogICAgICAgICByZmFjdCA9IGZhY3RvcihSRUdJT04sIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSByb3JkKSkgJT4lCiAgYXJyYW5nZShzZmFjdCwgcmZhY3QsIExBVElUVURFX00pCgpub3JkIDwtIHVuaXF1ZShtZXRhZGF0YSRuZXduYW1lKQoKdG1wIDwtIG1ldGFkYXRhICU+JQogIG11dGF0ZSh4cG9zID0gMTpuKCkpCgpncm91cF9wb3MgPC0gdG1wICU+JQogIGdyb3VwX2J5KFNUQVRFX00pICU+JQogIHN1bW1hcmlzZShtaWR4ID0gKG1pbih4cG9zKSAtIDAuNSArIG1heCh4cG9zKSArIDAuNSkvIDIsIAogICAgICAgICAgICBsaW5leCA9IG1heCh4cG9zKSArIDAuNSkgJT4lCiAgbXV0YXRlKG1pZHkgPSAxKQoKcG9wX3BvcyA8LSB0bXAgJT4lCiAgZ3JvdXBfYnkoU1RBVEVfTSwgUkVHSU9OKSAlPiUKICBzdW1tYXJpc2UobWlkeCA9IChtaW4oeHBvcykgLSAwLjUgKyBtYXgoeHBvcykgKyAwLjUpIC8gMiwgCiAgICAgICAgICAgIGxpbmV4ID0gbWF4KHhwb3MpICsgMC41KSAlPiUKICBtdXRhdGUobWlkeSA9IDApCgpuZ3NhZG1peF9maWxlcyA8LSBkaXJfbHMoImRhdGEvYWxsX3NhbXBsZXMvbmdzYWRtaXgiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2UgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2IgPSAiKi5xb3B0X3dpdGhfc2FtcGxlX25hbWVzIikKCm5nc0FkbWl4X3RpYiA8LSBsYXBwbHkobmdzYWRtaXhfZmlsZXMsIGZ1bmN0aW9uKHgpIHsKICByZWFkLnRhYmxlKHgsIAogICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lCiAgICBwaXZvdF9sb25nZXIoY29scyA9IC1zYW1wbGUsIAogICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIlF2YWwiLCAKICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUKICAgIG11dGF0ZShwYXRoID0geCwgCiAgICAgICAgICAgLmJlZm9yZSA9IHNhbXBsZSkKfSkgJT4lCiAgYmluZF9yb3dzKCkgJT4lCiAgZmlsdGVyKCFpcy5uYSh2YWx1ZSkpICU+JQogIG11dGF0ZShRdmFsID0gc3RyX3JlcGxhY2UoUXZhbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEiKSkgJT4lCiAgZXh0cmFjdChwYXRoLCAKICAgICAgICAgIGludG8gPSBjKCJLIiwgCiAgICAgICAgICAgICAgICAgICAicmVwIiksIAogICAgICAgICAgcmVnZXggPSAiLipLXyhbMC05XSspX3JlcF8oWzAtOV0rKS8uKiQiLCAKICAgICAgICAgIGNvbnZlcnQgPSBUUlVFKSAlPiUKICBpbm5lcl9qb2luKC4sIAogICAgICAgICAgICAgbWV0YWRhdGEsIAogICAgICAgICAgICAgYnkgPSBjKCJzYW1wbGUiID0gIk5NRlNfRE5BX0lELi4uNiIpLCAKICAgICAgICAgICAgIHJlbGF0aW9uc2hpcCA9ICJtYW55LXRvLW1hbnkiKSAlPiUKICBtdXRhdGUoc2ZhY3QgPSBmYWN0b3IoU1RBVEVfTSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHNvcmQpLCAKICAgICAgICAgcmZhY3QgPSBmYWN0b3IoUkVHSU9OLAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSByb3JkKSkgJT4lCiAgYXJyYW5nZShzZmFjdCwgcmZhY3QpCgpgYGAKCgpgYGB7ciBhbGxfS3N9CnBsb3QgPC0gZ2dwbG90KGZpbHRlcihuZ3NBZG1peF90aWIsIHJlcCA9PSAxKSkgKyAKICBnZW9tX2NvbChtYXBwaW5nID0gYWVzKHggPSBmYWN0b3IobmV3bmFtZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IG5vcmQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB2YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gUXZhbCkpICsKICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcWNvbG9ycykgKyAKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKSArCiAgZmFjZXRfZ3JpZChLIH4gcmVwKSArCiAgbGFicyh4ID0gIiIsIAogICAgICAgeSA9ICJRIHZhbHVlIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHBvcF9wb3MkbGluZXgsIAogICAgICAgICAgICAgbGluZXR5cGUgPSAxLCAKICAgICAgICAgICAgIGNvbG9yID0gImdyYXkyNSIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBncm91cF9wb3MkbGluZXgpCgoKcGxvdApgYGAKCgpgYGB7ciBLMn0Kc3F1aWRfcGFsZXR0ZSA8LSBjKCIjMzEwYjFhIiwgIiM4MjFhMjMiLCAiI2RlNmM3NCIsICIjNGEzZDUxIiwgIiM5MTgzOWEiLCAiIzliYTJhYyIsICIjNjE3ZWE2IiwgIiM1MDlhYjciLCAiIzk3NTczMyIsICIjY2VhNmFlIikKCksyIDwtIHJlYWQudGFibGUoImRhdGEvYWxsX3NhbXBsZXMvbmdzYWRtaXgvbWFmXzAuMDUvS18yX3JlcF8xL291dHB1dC5xb3B0X3dpdGhfc2FtcGxlX25hbWVzIiwgaGVhZGVyID0gVFJVRSkgJT4lCiAgaW5uZXJfam9pbiguLCAKICAgICAgICAgICAgIG1ldGFkYXRhLCAKICAgICAgICAgICAgIGJ5ID0gYygic2FtcGxlIiA9ICJOTUZTX0ROQV9JRC4uLjYiKSkKSzJfb3JkZXJlZCA8LSBLMltvcmRlcihLMiRzZmFjdCwgSzIkcmZhY3QpLF0KCnRtcCA8LSBLMl9vcmRlcmVkICU+JQogIG11dGF0ZSh4cG9zID0gMTpuKCkpCnN0YXRlX3BvcyA8LSB0bXAgJT4lCiAgZ3JvdXBfYnkoU1RBVEVfTSkgJT4lCiAgc3VtbWFyaXNlKG1pZHggPSAobWluKHhwb3MpIC0gMC41ICsgbWF4KHhwb3MpICswLjUpIC8gMiwgCiAgICAgICAgICAgIGxpbmV4ID0gbWF4KHhwb3MpKSAlPiUKICBtdXRhdGUobWlkeSA9IDEpCnJlZ19wb3MgPC0gdG1wICU+JQogIGdyb3VwX2J5KFNUQVRFX00sIFJFR0lPTikgJT4lCiAgc3VtbWFyaXNlKG1pZHggPSAobWluKHhwb3MpIC0gMC41KSwgCiAgICAgICAgICAgIGxpbmV4ID0gbWF4KHhwb3MpKSAlPiUKICBtdXRhdGUobWlkeSA9IC0xKQoKc3F1aWRfcGFsZXR0ZV8yIDwtIGMoIiMzMTBiMWEiLCAKICAgICAgICAgICAgICAgICAgICAgICIjZGU2Yzc0IikKCmJhcnBsb3QodChLMl9vcmRlcmVkWzI6NF0pLCAKICAgICAgICAgY29sID0gc3F1aWRfcGFsZXR0ZV8yLCAKICAgICAgICAgbmFtZXMgPSBLMl9vcmRlcmVkJHNhbXBsZSwgCiAgICAgICAgIGNleC5uYW1lcyA9IDAuNSwKICAgICAgICAgbGFzID0gMiwKICAgICAgICAgc3BhY2UgPSAwLCAKICAgICAgICAgYm9yZGVyID0gTkEsIAogICAgICAgICBjZXguYXhpcyA9IDEsIAogICAgICAgICBjZXgubGFiID0gMS4xMywgCiAgICAgICAgIHhwZCA9IE5BLCAKICAgICAgICAgeWxhYiA9IHBhc3RlMCgiQWRtaXh0dXJlIFByb3BvcnRpb25zIChLPTIpIikpCiAgYWJsaW5lKHYgPSByZWdfcG9zJGxpbmV4LCBjb2wgPSAiZ3JheTgwIiwgbHR5ID0gMikgCiAgYWJsaW5lKHYgPSBzdGF0ZV9wb3MkbGluZXgsIGNvbCA9ICJ3aGl0ZSIpIAogICMgdGV4dChsYWJlbHMgPSByZWdfcG9zJFJFR0lPTiwKICAjICAgICAgY2V4ID0gMC44LAogICMgICAgICBzcnQgPSA5MCwKICAjICAgICAgeCA9IHJlZ19wb3MkbWlkeCArIDAuNSwKICAjICAgICAgeSA9IDEuMDAxLAogICMgICAgICBhZGogPSAwLAogICMgICAgICB4cGQgPSBOQSkKYGBgCgoKYGBge3IgSzN9CnNxdWlkX3BhbGV0dGUgPC0gYygiIzMxMGIxYSIsICIjODIxYTIzIiwgIiNkZTZjNzQiLCAiIzRhM2Q1MSIsICIjOTE4MzlhIiwgIiM5YmEyYWMiLCAiIzYxN2VhNiIsICIjNTA5YWI3IiwgIiM5NzU3MzMiLCAiI2NlYTZhZSIpCgpLMyA8LSByZWFkLnRhYmxlKCJkYXRhL2FsbF9zYW1wbGVzL25nc2FkbWl4L21hZl8wLjA1L0tfM19yZXBfMS9vdXRwdXQucW9wdF93aXRoX3NhbXBsZV9uYW1lcyIsIGhlYWRlciA9IFRSVUUpICU+JQogIGlubmVyX2pvaW4oLiwgCiAgICAgICAgICAgICBtZXRhZGF0YSwgCiAgICAgICAgICAgICBieSA9IGMoInNhbXBsZSIgPSAiTk1GU19ETkFfSUQuLi42IikpCkszX29yZGVyZWQgPC0gSzNbb3JkZXIoSzMkc2ZhY3QsIEszJHJmYWN0KSxdCgpzcXVpZF9wYWxldHRlXzMgPC0gYygiI2RlNmM3NCIsCiAgICAgICAgICAgICAgICAgICAgICIjMzEwYjFhIiwKICAgICAgICAgICAgICAgICAgICAgIiM0YTNkNTEiKQoKYmFycGxvdCh0KEszX29yZGVyZWRbMjo1XSksIAogICAgICAgICBjb2wgPSBzcXVpZF9wYWxldHRlXzMsIAogICAgICAgICBuYW1lcyA9IE5VTEwsIAogICAgICAgICBjZXgubmFtZXMgPSAwLjAwMDAxLAogICAgICAgICBsYXMgPSAyLAogICAgICAgICBzcGFjZSA9IDAsIAogICAgICAgICBib3JkZXIgPSBOQSwgCiAgICAgICAgIGNleC5heGlzID0gMSwgCiAgICAgICAgIGNleC5sYWIgPSAxLjEzLCAKICAgICAgICAgeHBkID0gTkEsIAogICAgICAgICB5bGFiID0gcGFzdGUwKCJBZG1peHR1cmUgUHJvcG9ydGlvbnMgKEs9MykiKSkKICBhYmxpbmUodiA9IHJlZ19wb3MkbGluZXgsIGNvbCA9ICJncmF5ODAiLCBsdHkgPSAyKSAKICBhYmxpbmUodiA9IHN0YXRlX3BvcyRsaW5leCwgY29sID0gIndoaXRlIikgCiAgIyB0ZXh0KGxhYmVscyA9IHJlZ19wb3MkUkVHSU9OLAogICMgICAgICBjZXggPSAwLjgsCiAgIyAgICAgIHNydCA9IDkwLAogICMgICAgICB4ID0gcmVnX3BvcyRtaWR4ICsgMC41LAogICMgICAgICB5ID0gMS4wMDEsCiAgIyAgICAgIGFkaiA9IDAsCiAgIyAgICAgIHhwZCA9IE5BKQpgYGAKCmBgYHtyIEs0fQpzcXVpZF9wYWxldHRlIDwtIGMoIiMzMTBiMWEiLCAiIzgyMWEyMyIsICIjZGU2Yzc0IiwgIiM0YTNkNTEiLCAiIzkxODM5YSIsICIjOWJhMmFjIiwgIiM2MTdlYTYiLCAiIzUwOWFiNyIsICIjOTc1NzMzIiwgIiNjZWE2YWUiKQoKSzQgPC0gcmVhZC50YWJsZSgiZGF0YS9hbGxfc2FtcGxlcy9uZ3NhZG1peC9tYWZfMC4wNS9LXzRfcmVwXzEvb3V0cHV0LnFvcHRfd2l0aF9zYW1wbGVfbmFtZXMiLCBoZWFkZXIgPSBUUlVFKSAlPiUKICBpbm5lcl9qb2luKC4sIAogICAgICAgICAgICAgbWV0YWRhdGEsIAogICAgICAgICAgICAgYnkgPSBjKCJzYW1wbGUiID0gIk5NRlNfRE5BX0lELi4uNiIpKQpLNF9vcmRlcmVkIDwtIEs0W29yZGVyKEs0JHNmYWN0LCBLNCRyZmFjdCksXQoKc3F1aWRfcGFsZXR0ZV80IDwtIGMoIiNkZTZjNzQiLAogICAgICAgICAgICAgICAgICAgICAiIzMxMGIxYSIsCiAgICAgICAgICAgICAgICAgICAgICIjNGEzZDUxIiwgCiAgICAgICAgICAgICAgICAgICAgICIjNTA5YWI3IikKCmJhcnBsb3QodChLNF9vcmRlcmVkWzI6Nl0pLCAKICAgICAgICAgY29sID0gc3F1aWRfcGFsZXR0ZV80LCAKICAgICAgICAgbmFtZXMgPSBOVUxMLCAKICAgICAgICAgY2V4Lm5hbWVzID0gMC4wMDAwMSwKICAgICAgICAgbGFzID0gMiwKICAgICAgICAgc3BhY2UgPSAwLCAKICAgICAgICAgYm9yZGVyID0gTkEsIAogICAgICAgICBjZXguYXhpcyA9IDEsIAogICAgICAgICBjZXgubGFiID0gMS4xMywgCiAgICAgICAgIHhwZCA9IE5BLCAKICAgICAgICAgeWxhYiA9IHBhc3RlMCgiQWRtaXh0dXJlIFByb3BvcnRpb25zIChLPTQpIikpCiAgYWJsaW5lKHYgPSByZWdfcG9zJGxpbmV4LCBjb2wgPSAiZ3JheTgwIiwgbHR5ID0gMikgCiAgYWJsaW5lKHYgPSBzdGF0ZV9wb3MkbGluZXgsIGNvbCA9ICJ3aGl0ZSIpIAogICMgdGV4dChsYWJlbHMgPSByZWdfcG9zJFJFR0lPTiwgCiAgIyAgICAgIGNleCA9IDIsIAogICMgICAgICBzcnQgPSA5MCwKICAjICAgICAgeCA9IHJlZ19wb3MkbWlkeCArIDAuNSwgCiAgIyAgICAgIHkgPSAxLjAwMSwgCiAgIyAgICAgIGFkaiA9IDAsIAogICMgICAgICB4cGQgPSBOQSkKYGBg